/*
 * Copyright 2024 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.github.hylexus.xtream.codec.ext.jt1078.boot.configuration;

import io.github.hylexus.xtream.codec.ext.jt1078.boot.properties.XtreamJt1078ServerProperties;
import io.github.hylexus.xtream.codec.ext.jt1078.processor.DefaultJt1078XtreamScheduleRegistryCustomizer;
import io.github.hylexus.xtream.codec.ext.jt1078.spec.resources.DefaultJt1078XtreamSchedulerRegistry;
import io.github.hylexus.xtream.codec.ext.jt1078.spec.resources.Jt1078XtreamSchedulerRegistry;
import io.github.hylexus.xtream.codec.server.reactive.spec.XtreamSchedulerRegistryCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

import java.util.List;

@Import({
        // todo
        // BuiltinJt808ServerCustomSchedulerRegistrar.class,
        // BuiltinJt808ServerSchedulerConfigurationWithMicroMeter.class,
})
public class BuiltinJt1078ServerSchedulerConfiguration {

    @Bean
    @ConditionalOnMissingBean
    Jt1078XtreamSchedulerRegistry xtreamSchedulerRegistry(List<XtreamSchedulerRegistryCustomizer> customizers) {
        return new DefaultJt1078XtreamSchedulerRegistry(customizers, (config, scheduler) -> scheduler);
    }

    @Bean(name = Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_CODEC)
    @ConditionalOnMissingBean(name = Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_CODEC)
    XtreamSchedulerRegistryCustomizer avCodecSchedulerCustomizer(XtreamJt1078ServerProperties serverProperties) {
        return new DefaultJt1078XtreamScheduleRegistryCustomizer(Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_CODEC, serverProperties.getAudioVideoStream().getCodec().getScheduler());
    }

    @Bean(name = Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_SUBSCRIBER)
    @ConditionalOnMissingBean(name = Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_SUBSCRIBER)
    XtreamSchedulerRegistryCustomizer avSubscriberSchedulerCustomizer(XtreamJt1078ServerProperties serverProperties) {
        return new DefaultJt1078XtreamScheduleRegistryCustomizer(Jt1078XtreamSchedulerRegistry.SCHEDULER_NAME_AV_SUBSCRIBER, serverProperties.getAudioVideoStream().getSubscriber().getScheduler());
    }

}
